"""
在老式手机上，用户通过数字键盘输入，手机将提供与这些数字相匹配的单词列表。
每个数字映射到0至4个字母。
给定一个数字序列，实现一个算法来返回匹配单词的列表。
你会得到一张含有有效单词的列表。

映射如下所示：

示例 1:
    输入: num = "8733", words = ["tree", "used"]
    输出: ["tree", "used"]

示例 2:
    输入: num = "2", words = ["a", "b", "c", "d"]
    输出: ["a", "b", "c"]

提示：
    num.length <= 1000
    words.length <= 500
    words[i].length == num.length
    num中不会出现 0, 1 这两个数字
"""
import re


class Solution:
    def getValidT9Words(self, num, words):
        """遍历words与num一一对比"""
        table = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}
        return list(filter(lambda word: all(ch in table[key] for key, ch in zip(num, word)), words))

    def getValidT9Words_v2(self, num, words):
        """正则表达"""
        pattern = ["[a-c]", "[d-f]", "[g-i]", "[j-l]", "[m-o]", "[p-s]", "[t-v]", "[w-z]"]
        sb = ""
        for i in range(len(num)):
            sb += pattern[int(num[i]) - 2]
        res = []
        for word in words:
            if re.match(sb, word):
                res.append(word)
        return res


t9 = Solution()

print(t9.getValidT9Words('8733', ["tree", "used"]))
print(t9.getValidT9Words_v2('2', ["a", "b", "c", "d"]))
